package com.horsen.service.edu.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.horsen.service.base.model.VO.WebCourseOrderVO;
import com.horsen.service.edu.model.Course;
import com.horsen.service.edu.model.DTO.CourseInsertDTO;
import com.horsen.service.edu.model.DTO.CourseQueryDTO;
import com.horsen.service.edu.model.DTO.WebCourseQueryDTO;
import com.horsen.service.edu.model.VO.*;

import java.util.List;
import java.util.Map;

/**
 * 课程 服务类
 *
 * @author Horsen
 */
public interface CourseService extends IService<Course> {
    /**
     * 分页查询
     *
     * @param page           当前页码
     * @param limit          每页记录数
     * @param courseQueryDTO 课程查询DTO
     * @return IPage类实例
     */
    IPage<CourseListVO> pageSelect(Long page, Long limit, CourseQueryDTO courseQueryDTO);

    /**
     * 新增一个课程
     *
     * @param courseInsertDTO 课程新增DTO
     * @return 课程ID
     */
    String insert(CourseInsertDTO courseInsertDTO);

    /**
     * 根据ID获取一个CourseInfoVO
     *
     * @param id 课程ID
     * @return CourseInfoVO
     */
    CourseInfoVO queryInfoById(String id);

    /**
     * 修改一个课程
     *
     * @param courseInfoVO 课程信息VO
     * @return 是否修改成功
     */
    Boolean updateById(CourseInfoVO courseInfoVO);

    /**
     * 根据课程ID删除封面
     *
     * @param id 课程ID
     * @return 是否删除成功
     */
    Boolean deleteCoverById(String id);

    /**
     * 根据课程ID删除视频
     *
     * @param id 课程ID
     * @return 是否删除成功
     */
    Boolean deleteVideoById(String id);

    /**
     * 根据ID删除课程
     *
     * @param id 课程ID
     * @return 删除是否成功
     */
    Boolean deleteById(String id);

    /**
     * 根据ID获取一个CoursePublishVO
     *
     * @param id 课程ID
     * @return CoursePublishVO
     */
    CoursePublishVO getPublishById(String id);

    /**
     * 按条件获取课程
     *
     * @param webCourseQueryDTO 课程展示VO
     * @return 课程列表
     */
    List<Course> queryBy(WebCourseQueryDTO webCourseQueryDTO);

    /**
     * 根据ID获取课程信息并更新浏览量
     *
     * @param id 课程ID
     * @return WebCourseInfoVO
     */
    WebCourseInfoVO queryWebInfoById(String id);

    /**
     * 根据ID获取一个课程订单DTO
     *
     * @param id 课程ID
     * @return 课程订单DTO
     */
    WebCourseOrderVO getCourseOrderById(String id);

    /**
     * 根据ID增加课程销量
     *
     * @param id 课程ID
     * @return 是否修改成功
     */
    Boolean addBuyCount(String id);

    /**
     * 获取课程柱状图数据
     *
     * @return 课程柱状图VO
     */
    Map<String, Object> getChartValue();
}
